
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>13、ThreadPoolExecutor 线程池详解 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>13、ThreadPoolExecutor 线程池详解 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">ThreadPoolExecutor的生命周期包含哪五种状态？请简要描述它们。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ThreadPoolExecutor的五种状态是：RUNNING (接受新任务并处理队列任务)、SHUTDOWN (不接受新任务但处理队列任务)、STOP (不接受新任务，不处理队列任务，并中断正在执行的任务)、TIDYING (所有任务终止，活动线程为0时进入此状态)、TERMINATED (terminated()方法执行完毕)。</div>
          </div>
          <div class="card-source">来源: 一、ThreadPoolExecutor 基础概念 - 线程池的生命周期</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当一个新任务提交给ThreadPoolExecutor时，它的核心处理流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 如果当前运行线程数小于核心线程数(corePoolSize)，则创建新线程执行任务。<br>2. 如果运行线程数大于或等于核心线程数，则将任务放入工作队列。<br>3. 如果队列已满，且当前运行线程数小于最大线程数(maximumPoolSize)，则创建新线程执行任务。<br>4. 如果队列已满，且运行线程数等于最大线程数，则根据拒绝策略处理任务。</div>
          </div>
          <div class="card-source">来源: 三、线程池工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请解释ThreadPoolExecutor构造函数中的`corePoolSize`、`maximumPoolSize`和`keepAliveTime`这三个核心参数的作用。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`corePoolSize`是核心线程数，即线程池中始终保持的线程数量。`maximumPoolSize`是最大线程数，线程池允许创建的最大线程总数。`keepAliveTime`是空闲线程的存活时间，当线程数超过核心线程数时，多余的空闲线程如果空闲时间超过该值将被回收。</div>
          </div>
          <div class="card-source">来源: 二、核心参数详解 - 1. 核心参数说明</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">当线程池和工作队列都满了之后，ThreadPoolExecutor提供了哪四种预设的拒绝策略(RejectedExecutionHandler)？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. AbortPolicy: 直接抛出RejectedExecutionException异常（默认策略）。<br>2. CallerRunsPolicy: 让提交任务的线程自己执行该任务。<br>3. DiscardPolicy: 直接丢弃任务，不做任何处理。<br>4. DiscardOldestPolicy: 丢弃队列最前面的任务，然后重新提交当前任务。</div>
          </div>
          <div class="card-source">来源: 二、核心参数详解 - 3. 拒绝策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">调优</div>
          <div class="card-question">在进行线程池性能调优时，针对“计算密集型”和“I/O密集型”任务，`corePoolSize`的设置有何不同建议？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">调优</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于计算密集型任务，核心线程数通常建议设置为 CPU 核心数 + 1。对于 I/O 密集型任务，由于线程会因I/O操作而阻塞，可以设置更多的线程，例如 CPU 核心数 * (1 + 平均等待时间/平均工作时间)。</div>
          </div>
          <div class="card-source">来源: 五、线程池源码解析与性能调优 - 3. 线程池性能调优</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">相比直接创建和使用Thread对象，使用线程池有哪些主要优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用线程池的主要优势有四点：<br>1. 降低资源消耗：通过复用线程减少创建和销毁的开销。<br>2. 提高响应速度：任务到达时无需等待线程创建即可执行。<br>3. 提高线程的可管理性：统一管理线程，避免无限制创建。<br>4. 提供更多功能：如延时执行、定期执行、监控等。</div>
          </div>
          <div class="card-source">来源: 一、ThreadPoolExecutor 基础概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到了四种工作队列(workQueue)类型，`SynchronousQueue`的特点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`SynchronousQueue`是一种不存储元素的队列。它的每个插入操作都必须等待另一个线程调用移除操作，反之亦然。这使得任务可以直接从生产者递交给消费者线程，而无需在队列中缓冲。</div>
          </div>
          <div class="card-source">来源: 二、核心参数详解 - 2. 工作队列类型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在ThreadPoolExecutor的内部实现中，Worker类的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Worker是ThreadPoolExecutor的内部类，它继承了AbstractQueuedSynchronizer并实现了Runnable接口。它封装了实际执行任务的线程（Thread），并负责管理该线程的生命周期，不断从工作队列中获取任务并执行。</div>
          </div>
          <div class="card-source">来源: 五、线程池源码解析与性能调优 - 2. Worker线程源码解析</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">调优</div>
          <div class="card-question">根据文档的调优建议，对于需要确保任务不被丢弃的重要业务，应该选择哪种拒绝策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">调优</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于重要任务，文档建议选择`CallerRunsPolicy`。该策略会将任务回退给提交任务的调用者线程来执行，从而降低任务提交速度，避免因任务丢失而导致的问题。</div>
          </div>
          <div class="card-source">来源: 五、线程池源码解析与性能调优 - 3. 线程池性能调优</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
